package staticFactory;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;

public class Student implements  BeanNameAware,BeanFactoryAware,InitializingBean/*,DisposableBean */{

	private String stuName, sex;

	private String beanName;// 实现了BeanNameAware接口，Spring可以将BeanName注入该属性中
	// 将BeanFactory注入该属性中，用于表示spring容器(可以理解对象工厂， 所有对象由beanFactory创建且由beanFactory保存)
	private BeanFactory beanFactory;

	public Student() {
		System.out.println("1.【Student类的无参构造方法】: 创建学生对象的时候执行。 作用： 对对象进行初始化操作。");
	}

	public void setStuName(String stuName) {
		System.out.println("2.【setName()自定义方法】:  用set方式给属性赋值并在构造方法之后执行。 作用：注入学生的name属性");
		this.stuName = stuName;
	}

	//BeanNameAware的setBeanName()方法：如果某个Bean实现了BeanNameAware接口，那么Spring将会将Bean实例的ID传递给setBeanName()方法，
	// 在Bean类中新增一个beanName字段，并实现setBeanName()方法。
	public void setBeanName(String beanId) {
		this.beanName = beanId;
		System.out.println("3.【BeanNameAware接口的, setBeanName()方法】:  set方法执行完毕之后再执行。 作用：为bean对象设置id值，" +
				" Bean的id为：" + this.beanName);
	}

	//BeanFactoryAware的setBeanFactory方法。  用于将Spring容器的引用(beanFactory的引用)传递给bean对象，
	// 在此方法中可以通过beanFactory对象来获取Spring容器中的其他Bean对象。
	// beanFactory用于表示spring容器
	// (可以理解为对象工厂， 所有对象由beanFactory创建且由beanFactory保存)
	//在此方法中可以用beanFactory获取其他bean对象来调用(但是spring不推荐，推荐用DI注入的方式)
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		this.beanFactory = beanFactory;
		System.out.println("4.【BeanFactoryAware接口的， setBeanFactory()方法】:  bean的id设置完后执行。 " +
				"作用：可以得到beanFactory对象的引用:"+beanFactory);
		//比如：bean对象通过spring容器发布事件
	}

	//对象的属性设置完毕后，Spring容器会调用InitializingBean接口的afterPropertiesSet方法来对对象一些初始化操作
	// (若不需要就不用实现InitializingBean接口)。
	public void afterPropertiesSet() throws Exception {
		System.out.println("5.【InitializingBean接口的, afterPropertiesSet()方法】 :一个bean实例化完后(全部属性设置完之后)执行。 " +
				"作用：来完成一些初始化操作。(和init-method属性属性设置的方法一样)");
	}

	// 自己编写的初始化方法
	public void myInit() {
		System.out.println("6.【init-method属性设置的方法myInit()】:  一个bean实例化完后(全部属性设置完之后)执行。 " +
				"作用： 对对象进行初始化");
	}

	//destroy()的回调执行时机是Spring容器关闭，需要销毁所有的bean时；
	/*public void destroy() throws Exception {
		System.out.println("7.【DisposableBean接口】 销毁所有的bean时,会调用DisposableBean接口的destroy方法");
	}*/

	// 自己编写的销毁方法(和上边的方法相同)
	public void myDestroy() {
		System.out.println("7.【destroy-method属性设置的方法myDestroy()】： 容器关闭的时候执行， " +
				"在销毁bean对象之前执行此方法进行一些操作(比如提示对象即将被销毁)");
	}


	public void setSex(String sex) {
		System.out.println("【set注入】注入学生的sex属性");
		this.sex = sex;
	}

	public String getSex() {
		return sex;
	}



	public String getStuName() {
		return stuName;
	}



	public String toString() {
		String msString = String.format("com.StudentBean{ name=%s,sex=%s }", stuName,  sex);
		return msString;
	}




}
